//
//  ViewController.m
//  TestRunTime
//
//  Created by 吴志勇 on 2020/3/22.
//  Copyright © 2020 wzy. All rights reserved.
//

#import "ViewController.h"
#import <objc/message.h>


//1.修饰全局变量 =>全局只读变量
NSString * const name = @"name";

/**
    static:1.修饰局部变量，被static修饰局部变量，延长生命周期，跟整个应用程序x有关
                            被tstatic修饰的局部变量只会分配一次内存，程序一运行就会给static修饰变量分配内存
        2.修饰全局变量，被static修饰全局变量，作用域会修改，只能在当前文件下使用
        external:声明外部全局变量。注意：extern只能用于声明，不能用于定义
 */

@interface ViewController ()
/*
  *const与宏的区别
  *1.编译时刻 宏：预编译  const: 编译
  *2.编译检查 宏没有编译检查,const有编译检查
  *3.宏的好处 定义函数，方法。const不可以
  *4.宏的好处 大量使用宏，会导致预编译时间过长
 */

//2.

@end

@implementation ViewController

//2.修饰方法中参数
- (void)test:(int const *)a{
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    id objc = objc_msgSend([NSObject class], @selector(alloc));
    objc = objc_msgSend(objc, @selector(init));
    
    
    //class:获取当前方法调用者的类
    //superClass:获取当前方法调用真的父类
    //super:z仅仅是一个编译指示器，就是给编译器看的，不是一个指针
    //本质:只要编译器看到super这个标志，就会让当前对象去调用父类的方法，本质还是当前对象调用
    
    int a = 10;
    int *p = &a;
    NSLog(@"p = %p,*p = %d,&p = %p,a = %d，&a = %p",p,*p,&p,a,&a);

    
    
    /*
     p是一个指针变量的名字，表示此指针变量指向的内存地址，如果使用%p来输出的话，他将是一个16进制数，从上面的结果可以看到打印P和&a的值是一样的
        *p 表示此指针指向内存地址存放的内容，一般是一个和指针类型一致的变量或者常量，*p和a的值是一样的
        &是取地址运算符，&p就是取指针p的地址
     
     */
    
    
}


@end
